/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package views;

import entities.*;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.FocusEvent;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.Query;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.table.TableColumn;
import logica.DetalleAlquiler;
import logica.cargadorPlanilla;
import renders.DiaRender;

//TODO Terminar tratamiento de excepciones con UiComponent y borrar botón IR A FECHA
/**
 *
 * @author Facu
 */
public class VistaDisponibilidad extends javax.swing.JPanel {

    public static JFrame frame;
    private final int COLUMNAFERIADOS = 1;
    public static boolean editado = false;

    public JFrame getFrame() {
        return frame;
    }
    cargadorPlanilla cargador = new cargadorPlanilla();
    Calendar fechaReferencia;
    private Query query;
    private EntityManager entityManager;
    public static List<Feriados> feriados;
    public static List<Temporada> temporada;
    public static List<Alquileres> alquileres;
    private int[] arreglo;
    private Query Query1;
    private static Usuarios usuario;
    private static EntityManager entityManagerAlquileres;
    private EntityManager entityManagerFeriados;
    private EntityManager entityManagerTemporadas;
    private EntityManager entityManagerDetalleAlquiler;

    /**
     * Creates new form VistaDisponibilidad
     */
    public VistaDisponibilidad(Usuarios usuario) {
        initComponents();
        entityManager = java.beans.Beans.isDesignTime() ? null : javax.persistence.Persistence.createEntityManagerFactory("SIAATPU").createEntityManager();
        tablaDisponibilidad.setShowHorizontalLines(true);
        tablaDisponibilidad.setShowVerticalLines(true);
        cargador.cargarPlanilla(Calendar.getInstance(), 0, tablaDisponibilidad);
        fechaReferencia = Calendar.getInstance();
        entityManagerFeriados = java.beans.Beans.isDesignTime() ? null : javax.persistence.Persistence.createEntityManagerFactory("SIAATPU").createEntityManager();
        entityManagerTemporadas = java.beans.Beans.isDesignTime() ? null : javax.persistence.Persistence.createEntityManagerFactory("SIAATPU").createEntityManager();
        entityManagerAlquileres = java.beans.Beans.isDesignTime() ? null : javax.persistence.Persistence.createEntityManagerFactory("SIAATPU").createEntityManager();
        entityManagerDetalleAlquiler = java.beans.Beans.isDesignTime() ? null : javax.persistence.Persistence.createEntityManagerFactory("SIAATPU").createEntityManager();
        VistaDisponibilidad.feriados = busquedaFeriados(entityManager);
        VistaDisponibilidad.temporada = busquedaTemporada(entityManager);
        VistaDisponibilidad.alquileres = busquedaAlquileres(entityManager);
        this.usuario = usuario;
        tablaDisponibilidad.setDefaultRenderer(UnidadesAlojamiento.class, new DiaRender());
        setRender(tablaDisponibilidad);
        if ("INVITADO".equals(usuario.getRol().getNombre())) {
            reservarButton.setEnabled(false);
        }
    }

    private void setRender(JTable tablaDisponibilidad) {
        for (int i = 0; i < tablaDisponibilidad.getColumnCount(); i++) {
            tablaDisponibilidad.getColumnModel().getColumn(i).setCellRenderer(new DiaRender());
            tablaDisponibilidad.getColumnModel().getColumn(i).setResizable(false);
        }
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jSlider1 = new javax.swing.JSlider();
        jScrollPane1 = new javax.swing.JScrollPane();
        tablaDisponibilidad = new javax.swing.JTable();
        botonDiaHoy = new javax.swing.JButton();
        botonFechaUp = new javax.swing.JButton();
        botonFechaDown = new javax.swing.JButton();
        botonFechaDobleUp = new javax.swing.JButton();
        botonFechaDobleDown = new javax.swing.JButton();
        calendarioFechaEspecifica = new com.toedter.calendar.JDateChooser();
        botonFechaEspecifica = new javax.swing.JButton();
        tituloLabel = new javax.swing.JLabel();
        reservarButton = new javax.swing.JButton();
        ayudaLabel2 = new javax.swing.JLabel();

        setMaximumSize(new java.awt.Dimension(924, 750));
        setMinimumSize(new java.awt.Dimension(924, 750));

        tablaDisponibilidad.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
        tablaDisponibilidad.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null}
            },
            new String [] {
                "Mes", "Dia"
            }
        ) {
            boolean[] canEdit = new boolean [] {
                false, false
            };

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        entityManager = java.beans.Beans.isDesignTime() ? null : javax.persistence.Persistence.createEntityManagerFactory("SIAATPU").createEntityManager();
        Query1 = entityManager.createQuery("SELECT ua FROM UnidadesAlojamiento ua WHERE ua.activo = 'SI' ORDER BY ua.idUnidad");
        List<UnidadesAlojamiento> unidadesAlojamientoResultList = (List<UnidadesAlojamiento>) Query1.getResultList();

        for (int i = 0; unidadesAlojamientoResultList.size() > i; i++) {

            TableColumn nuevaColumna = new TableColumn();

            nuevaColumna.setHeaderValue(unidadesAlojamientoResultList.get(i).getNombre().toString());

            //canEdite[i + 2] = false;
            tablaDisponibilidad.getColumnModel().addColumn(nuevaColumna);

        }

        String nombresColumnas[] = new String[tablaDisponibilidad.getColumnCount()];
        nombresColumnas[0] = "Mes";
        nombresColumnas[1] = "Dia";
        for (int i = 2; i < tablaDisponibilidad.getColumnCount(); i++) {
            nombresColumnas[i] = tablaDisponibilidad.getColumnModel().getColumn(i).getHeaderValue().toString();
        }

        tablaDisponibilidad.setModel(new javax.swing.table.DefaultTableModel(
            new Object[tablaDisponibilidad.getRowCount()][tablaDisponibilidad.getColumnCount()],
            nombresColumnas) {

            boolean[] canEdit = new boolean[tablaDisponibilidad.getColumnCount()];

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit[columnIndex];
            }
        });
        tablaDisponibilidad.setColumnSelectionAllowed(true);
        tablaDisponibilidad.setRowHeight(25);
        tablaDisponibilidad.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_INTERVAL_SELECTION);
        tablaDisponibilidad.getTableHeader().setResizingAllowed(false);
        tablaDisponibilidad.getTableHeader().setReorderingAllowed(false);
        tablaDisponibilidad.addMouseWheelListener(new java.awt.event.MouseWheelListener() {
            public void mouseWheelMoved(java.awt.event.MouseWheelEvent evt) {
                tablaDisponibilidadMouseWheelMoved(evt);
            }
        });
        tablaDisponibilidad.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                tablaDisponibilidadMouseClicked(evt);
            }
        });
        jScrollPane1.setViewportView(tablaDisponibilidad);
        tablaDisponibilidad.getColumnModel().getSelectionModel().setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        tablaDisponibilidad.getColumnModel().getColumn(0).setResizable(false);
        tablaDisponibilidad.getColumnModel().getColumn(1).setResizable(false);

        botonDiaHoy.setBackground(new java.awt.Color(1, 154, 210));
        botonDiaHoy.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        botonDiaHoy.setForeground(new java.awt.Color(255, 255, 255));
        botonDiaHoy.setText("Dia de hoy");
        botonDiaHoy.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonDiaHoyActionPerformed(evt);
            }
        });

        botonFechaUp.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/arrow_up.png"))); // NOI18N
        botonFechaUp.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonFechaUpActionPerformed(evt);
            }
        });

        botonFechaDown.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/arrow_down.png"))); // NOI18N
        botonFechaDown.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonFechaDownActionPerformed(evt);
            }
        });

        botonFechaDobleUp.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/arrow_double_up.png"))); // NOI18N
        botonFechaDobleUp.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonFechaDobleUpActionPerformed(evt);
            }
        });

        botonFechaDobleDown.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/arrow_double_down.png"))); // NOI18N
        botonFechaDobleDown.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonFechaDobleDownActionPerformed(evt);
            }
        });

        calendarioFechaEspecifica.setDateFormatString("d/M/yyyy");

        botonFechaEspecifica.setBackground(new java.awt.Color(1, 154, 210));
        botonFechaEspecifica.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        botonFechaEspecifica.setForeground(new java.awt.Color(255, 255, 255));
        botonFechaEspecifica.setText("Ir a Fecha");
        botonFechaEspecifica.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonFechaEspecificaActionPerformed(evt);
            }
        });

        tituloLabel.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N
        tituloLabel.setForeground(new java.awt.Color(102, 102, 102));
        tituloLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/info.png"))); // NOI18N
        tituloLabel.setText("Disponibilidad");

        reservarButton.setBackground(new java.awt.Color(1, 154, 210));
        reservarButton.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        reservarButton.setForeground(new java.awt.Color(255, 255, 255));
        reservarButton.setText("RESERVAR");
        reservarButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                reservarButtonActionPerformed(evt);
            }
        });

        ayudaLabel2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/help.png"))); // NOI18N
        ayudaLabel2.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseEntered(java.awt.event.MouseEvent evt) {
                ayudaLabel2MouseEntered(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(tituloLabel)
                            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                .addComponent(botonDiaHoy, javax.swing.GroupLayout.PREFERRED_SIZE, 138, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(calendarioFechaEspecifica, javax.swing.GroupLayout.PREFERRED_SIZE, 138, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(botonFechaEspecifica, javax.swing.GroupLayout.PREFERRED_SIZE, 138, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addComponent(reservarButton, javax.swing.GroupLayout.PREFERRED_SIZE, 138, javax.swing.GroupLayout.PREFERRED_SIZE)))
                    .addComponent(ayudaLabel2))
                .addGap(18, 18, 18)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 681, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(botonFechaDown, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(botonFechaDobleDown, javax.swing.GroupLayout.PREFERRED_SIZE, 57, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(botonFechaUp, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(botonFechaDobleUp, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 727, Short.MAX_VALUE)
                        .addContainerGap())
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(layout.createSequentialGroup()
                                .addComponent(botonFechaDobleUp, javax.swing.GroupLayout.PREFERRED_SIZE, 33, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(botonFechaUp)
                                .addGap(18, 18, 18)
                                .addComponent(botonFechaDown)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(botonFechaDobleDown, javax.swing.GroupLayout.PREFERRED_SIZE, 33, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addGroup(layout.createSequentialGroup()
                                .addComponent(tituloLabel)
                                .addGap(43, 43, 43)
                                .addComponent(calendarioFechaEspecifica, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(botonFechaEspecifica)
                                .addGap(18, 18, 18)
                                .addComponent(botonDiaHoy)))
                        .addGap(182, 182, 182)
                        .addComponent(reservarButton, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(152, 152, 152)
                        .addComponent(ayudaLabel2)
                        .addGap(0, 0, Short.MAX_VALUE))))
        );
    }// </editor-fold>//GEN-END:initComponents

    private class UiComponentListener implements java.awt.event.FocusListener, java.awt.event.KeyListener {

        @Override
        public void focusGained(FocusEvent e) {
            //TODO implementar cuando haga falta (focusGained)
        }

        @Override
        public void focusLost(FocusEvent e) {
            //TODO implementar cuando haga falta (focusLost)
        }

        @Override
        public void keyTyped(KeyEvent e) {
            //TODO implementar cuando haga falta (keyTyped)
        }

        @Override
        public void keyPressed(KeyEvent e) {
            if (e.getKeyCode() == 10) {
                irAFecha();
            }
        }

        @Override
        public void keyReleased(KeyEvent e) {
            //TODO implementar cuando haga falta (keyReleased)
        }
    }

    private void botonDiaHoyActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonDiaHoyActionPerformed
        mover(0);
    }//GEN-LAST:event_botonDiaHoyActionPerformed

    private void botonFechaDownActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonFechaDownActionPerformed
        mover(1);
    }//GEN-LAST:event_botonFechaDownActionPerformed

    public void mover(int movimiento) {
        if (movimiento == 0) {
            fechaReferencia = Calendar.getInstance();
            cargador.cargarPlanilla(fechaReferencia, movimiento, tablaDisponibilidad);
        } else {
            cargador.cargarPlanilla(fechaReferencia, movimiento, tablaDisponibilidad);
            fechaReferencia.add(Calendar.DAY_OF_MONTH, movimiento);
        }
        VistaDisponibilidad.feriados = busquedaFeriados(entityManagerFeriados);
        VistaDisponibilidad.temporada = busquedaTemporada(entityManagerTemporadas);
        VistaDisponibilidad.alquileres = busquedaAlquileres(entityManagerAlquileres);
    }

    private static List<Feriados> busquedaFeriados(EntityManager entityManager) {
        Date fechaInicio;
        Date fechaFin;
        Query query;

        fechaInicio = (Date) tablaDisponibilidad.getValueAt(0, 1);
        fechaFin = (Date) tablaDisponibilidad.getValueAt((tablaDisponibilidad.getRowCount() - 2), 1);
        query = entityManager.createNamedQuery("Feriados.findEntreFechas");
        query.setParameter("fechaInicio", fechaInicio);
        query.setParameter("fechaFin", fechaFin);
        List<Feriados> feriadosList = query.getResultList();
        return feriadosList;
    }

    private static List<Temporada> busquedaTemporada(EntityManager entityManager) {
        Date fechaInicio;
        Date fechaFin;
        Query query1;

        fechaInicio = (Date) tablaDisponibilidad.getValueAt(0, 1);
        fechaFin = (Date) tablaDisponibilidad.getValueAt((tablaDisponibilidad.getRowCount() - 2), 1);


        query1 = entityManager.createNamedQuery("Temporada.findentrefechas");
        query1.setParameter("fechaInicio", fechaInicio);
        query1.setParameter("fechaFin", fechaFin);

        List<Temporada> temporadaList = query1.getResultList();

        return temporadaList;
    }

    private static List<Alquileres> busquedaAlquileres(EntityManager entityManager) {
        Date fechaInicio;
        Date fechaFin;
        Query query1;

        fechaInicio = (Date) tablaDisponibilidad.getValueAt(0, 1);
        fechaFin = (Date) tablaDisponibilidad.getValueAt((tablaDisponibilidad.getRowCount() - 2), 1);

        query1 = entityManager.createNamedQuery("Alquileres.findEntreFechasSinCancelados");
        query1.setParameter("fechaInicio", fechaInicio);
        query1.setParameter("fechaFin", fechaFin);


        List<Alquileres> alquileresList = query1.getResultList();
        return alquileresList;
    }

    public static void resetear(EntityManager entityManager) {
        //VistaDisponibilidad.frame.dispose();
        //VistaDisponibilidad.main(usuario);
        //MenuPrincipal.rearmarFrame(VistaDisponibilidad.frame);
        VistaDisponibilidad.feriados = busquedaFeriados(entityManager);
        VistaDisponibilidad.temporada = busquedaTemporada(entityManager);
       // VistaDisponibilidad.alquileres = busquedaAlquileres(entityManager);
        VistaDisponibilidad.alquileres = busquedaAlquileres(entityManagerAlquileres);
        
        MenuPrincipal.rearmarFrame(VistaDisponibilidad.frame);
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        Dimension dimension = new Dimension((int) Math.round(screenSize.width * 1), (int) Math.round(screenSize.height * .9));
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frame.setMaximizedBounds(new Rectangle(dimension));
    }

    private void botonFechaUpActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonFechaUpActionPerformed
        //-1 es un dia hacia arriba
        mover(-1);
    }//GEN-LAST:event_botonFechaUpActionPerformed

    private void botonFechaDobleUpActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonFechaDobleUpActionPerformed
        mover(-7);
    }//GEN-LAST:event_botonFechaDobleUpActionPerformed

    private void botonFechaDobleDownActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonFechaDobleDownActionPerformed
        mover(7);
    }//GEN-LAST:event_botonFechaDobleDownActionPerformed

    private void irAFecha() {
        try {
            fechaReferencia = calendarioFechaEspecifica.getCalendar();
            cargador.cargarPlanilla(fechaReferencia, 0, tablaDisponibilidad);
            VistaDisponibilidad.feriados = busquedaFeriados(entityManager);
            VistaDisponibilidad.temporada = busquedaTemporada(entityManager);
            VistaDisponibilidad.alquileres = busquedaAlquileres(entityManager);

        } catch (NullPointerException npe) {
            JOptionPane.showMessageDialog(botonDiaHoy, "Lo ingresado como fecha es incorrecto");
            calendarioFechaEspecifica.getDateEditor().getUiComponent().requestFocus();
        }
    }

    private void botonFechaEspecificaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonFechaEspecificaActionPerformed
        irAFecha();
    }//GEN-LAST:event_botonFechaEspecificaActionPerformed

    private boolean unidadOcupada(String rotuloDepto, Date fechaInicio, Date fechaFin) {

        Query query1 = entityManager.createNamedQuery("Alquileres.findCantidadOcupadosEntreFechasSinCancelados");
        query1.setParameter("fechaInicio", fechaInicio);
        query1.setParameter("fechaFin", fechaFin);
        query1.setParameter("numeroDepto", rotuloDepto);

        Long cantUnidadesOcupadas = Long.valueOf((long) query1.getSingleResult());
        if (cantUnidadesOcupadas > 0) {
            return true;
        }
        return false;
    }

    private long setHoraCero(Date fecha) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(fecha);
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MILLISECOND, 0);
        long time = cal.getTimeInMillis();
        return time;
    }

    private void reservarButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_reservarButtonActionPerformed
        int column = tablaDisponibilidad.getSelectedColumn() - 1;

        if (column >= 1) {
            this.arreglo = tablaDisponibilidad.getSelectedRows();
            Date fechaArribo = new Date(setHoraCero((Date) tablaDisponibilidad.getValueAt(arreglo[0], 1)));
            Date fechaPartida = new Date(setHoraCero((Date) tablaDisponibilidad.getValueAt(arreglo[tablaDisponibilidad.getSelectedRowCount() - 1], 1)));
            if (!unidadOcupada(tablaDisponibilidad.getColumnName(tablaDisponibilidad.getSelectedColumn()), fechaArribo, fechaPartida)) {
                if (VistaNuevaReserva.getCantidadReservasCreadas() == 0) {
                    VistaNuevaReserva.main(column, fechaArribo, fechaPartida, usuario);
                } else {
                    JOptionPane.showMessageDialog(null, "Ya hay una reserva en curso...");
                    JOptionPane.showMessageDialog(null, "Por favor termine esa transacción para continuar...");
                }
            } else {
                JOptionPane.showMessageDialog(null, "El departamento seleccionado ya está ocupado");
            }
        } else {
            JOptionPane.showMessageDialog(null, "Seleccione un departamento");
        }
    }//GEN-LAST:event_reservarButtonActionPerformed

    private void tablaDisponibilidadMouseWheelMoved(java.awt.event.MouseWheelEvent evt) {//GEN-FIRST:event_tablaDisponibilidadMouseWheelMoved
        mover(evt.getWheelRotation());
        tablaDisponibilidad.clearSelection();

    }//GEN-LAST:event_tablaDisponibilidadMouseWheelMoved

    private void ayudaLabel2MouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_ayudaLabel2MouseEntered
        ayudaLabel2.setToolTipText("Desde esta pantalla podra verificar disponibilidad y realizar reservas");
    }//GEN-LAST:event_ayudaLabel2MouseEntered

    private Feriados buscarFeriado(Date fecha) {
        Query query2;
        query2 = entityManager.createNamedQuery("Feriados.findByFecha");
        query2.setParameter("fecha", fecha);
        List<Feriados> feriados = (List<Feriados>) query2.getResultList();
        if (feriados.size() == 0) {
            return null;
        }
        return feriados.get(0);
    }

    private void buscarDetalleAlquiler(Date fecha, String nombreColumna) {
        Query query2 = entityManagerDetalleAlquiler.createNamedQuery("Alquileres.findDetalleAlquiler");
        query2.setParameter("fecha", fecha);
        query2.setParameter("nombre", nombreColumna);
        Alquileres alquiler;
        try {
            alquiler = (Alquileres) query2.getSingleResult();
        } catch (NoResultException nrex) {
            alquiler = null;
        }
        if (alquiler != null) {
            System.out.println("alquiler: Tipo: "+alquiler.getTipoAlquiler()+". nombre: "+alquiler.getIdCliente().getNombres());
            DetalleAlquiler.main(alquiler, usuario);
        }
    }

    private void tablaDisponibilidadMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_tablaDisponibilidadMouseClicked
        int row, column;
        Date fecha;
        Feriados feriado;

        if (evt.getClickCount() == 2) {
            row = tablaDisponibilidad.getSelectedRow();
            column = tablaDisponibilidad.getSelectedColumn();
            fecha = (Date) tablaDisponibilidad.getValueAt(row, column);
            if (column == COLUMNAFERIADOS) {
                if ((feriado = buscarFeriado(fecha)) != null) {
                    JOptionPane.showMessageDialog(this, feriado.getDescripcion(), "Descripción de Feriado", JOptionPane.PLAIN_MESSAGE);
                }
            } else if (column > COLUMNAFERIADOS) {
                if (DetalleAlquiler.getCantidadDetallesCreados() == 0) {
                    buscarDetalleAlquiler(fecha, tablaDisponibilidad.getColumnName(column));
                } else {
                    JOptionPane.showMessageDialog(null, "No se puede ver más de un detalle de alquiler al mismo tiempo.");
                    JOptionPane.showMessageDialog(null, "Por favor cierre el detalle que tiene abierto y vuelva a intentarlo");
                }
            }
        }
    }//GEN-LAST:event_tablaDisponibilidadMouseClicked
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JLabel ayudaLabel2;
    public static javax.swing.JButton botonDiaHoy;
    private javax.swing.JButton botonFechaDobleDown;
    private javax.swing.JButton botonFechaDobleUp;
    private javax.swing.JButton botonFechaDown;
    private javax.swing.JButton botonFechaEspecifica;
    private javax.swing.JButton botonFechaUp;
    private com.toedter.calendar.JDateChooser calendarioFechaEspecifica;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JSlider jSlider1;
    private javax.swing.JButton reservarButton;
    private static javax.swing.JTable tablaDisponibilidad;
    private javax.swing.JLabel tituloLabel;
    // End of variables declaration//GEN-END:variables

    public static void main(Usuarios user) {
        final Usuarios usuario = user;
        VistaDisponibilidad.frame = new JFrame();
        EventQueue.invokeLater(new Runnable() {

            public void run() {
                Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
                Dimension dimension = new Dimension((int) Math.round(screenSize.width * 1), (int) Math.round(screenSize.height * .9));
                frame.setContentPane(new VistaDisponibilidad(usuario));
                frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
                frame.setMaximizedBounds(new Rectangle(dimension));
                frame.pack();
                frame.setVisible(true);
                frame.setTitle("Administracion   -   Disponibilidad   -   Sistema Integrado de Administración de Alquileres Turísticos  ");
                frame.setIconImage(new ImageIcon(getClass().getResource("/images/logo.png")).getImage());
                frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
                frame.addWindowListener(new WindowAdapter() {

                    public void windowClosing(WindowEvent e) {
                        if (frame != null) {
                            frame.setVisible(false);
                        }
                        frame = null;
                    }
                });
            }
        });
    }
}
